package cn.IT.dao.impl;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import cn.IT.dao.IBaseDAO;

@Repository
@SuppressWarnings("all")
public class BaseDAO<T> implements IBaseDAO<T> {
	
	@Autowired
	private SessionFactory sessionFactory;

	// 根据ID加载实体
	@SuppressWarnings("unchecked")
	public T get(Class<T> entityClazz, Serializable id) {
		return (T) sessionFactory.getCurrentSession().get(entityClazz, id);
	}

	// 保存实体
	public Serializable save(T entity) {
		return sessionFactory.getCurrentSession().save(entity);
	}

	// 更新实体
	public void update(T entity) {
		this.sessionFactory.getCurrentSession().update(entity);
	}

	public void saveOrUpdate(T entity) {
		this.sessionFactory.getCurrentSession().saveOrUpdate(entity);
	}

	// 删除实体
	public void delete(T entity) {
		sessionFactory.getCurrentSession().delete(entity);
	}

	// 根据ID删除实体
	public void delete(Class<T> entityClazz, Serializable id) {
		sessionFactory.getCurrentSession().createQuery("delete " + entityClazz.getSimpleName() + " en where en.id = ?0")
				.setParameter("0", id).executeUpdate();
	}

	// 获取所有实体
	public List<T> findAll(Class<T> entityClazz) {
		return find("select en from " + entityClazz.getSimpleName() + " en");
	}
	// 获取实体总数

	public long findCount(Class<T> entityClazz) {
		List<?> l = find("select count(*) from " + entityClazz.getSimpleName()); // getSimpleName()返回类名。
		// 返回查询得到的实体总数
		if (l != null && l.size() == 1) {
			return (Long) l.get(0);
		}
		return 0;
	}

	// 根据HQL语句查询实体
	@SuppressWarnings("unchecked")
	public List<T> find(String hql) {
		return (List<T>) sessionFactory.getCurrentSession().createQuery(hql).list();
	}

	// 通过带参hql查询
	@Override
	public List<T> find(String hql, Map<String, Object> params) {
		Query q = this.sessionFactory.getCurrentSession().createQuery(hql);
		if (params != null && !params.isEmpty()) {
			for (String key : params.keySet()) {
				q.setParameter(key, params.get(key));
			}
		}
		return q.list();
	}

}
